[アップデート] AWS LambdaのAmazon SQSイベントソースで最大同時実行数を指定できるようになりました
こんにちは。サービス部の武田です。
AWS Lambdaはイベントソースマッピングという機能を利用することで、イベントソースとなるサービスを自動でポーリングしLambda関数をバッチ処理として呼び出せます。
これまでAmazon SQSをイベントソースとして利用する際に、Lambda関数の同時実行数を制限したい場合は「同時実行の予約」で指定していました。しかしこの方法では、制限数を超えたメッセージはキューに返され再試行を待つことになり、適切に設定されていないとすべてのメッセージを正しく処理できませんでした。
今回のアップデートでイベントソースマッピングの設定として同時実行数を指定できるようになりました。これにより、制限数を超えた場合はメッセージの読み取りが停止され、メッセージはそのままキューに残り読み取られるのを待つようになります。
やってみた
最大同時実行数を指定した場合としなかった場合の挙動を見てみましょう。
まずはイベントソースとなる標準キューをLambdaTestQueue
という名前で作成しました。設定はすべてデフォルトです。
次にイベントハンドラとなるLambda関数をMaximumConcurrencyTest
という名前で作成しました。ランタイムやアーキテクチャは任意で問題ありません。
今回作成するLambda関数はSQSをポーリングする必要があるため、実行ロールにアクセス権限を追加します。
作成した関数の処理は、実行時間を稼ぐため10秒間スリープだけします。またタイムアウトを デフォルトの3秒から12秒に変更 しました。
import time def lambda_handler(event, context): time.sleep(10)
Lambda関数が作成できたらトリガーとしてSQSのLambdaTestQueue
を指定します。
まずは従来の挙動を確認するためMaxinum concurrency
は空欄のままでやってみます。
設定できました。
それでは実際に試してみます。次のコマンドを手元で実行し、キューにメッセージを追加します。
$ seq 50 | xargs -L 1 -P 10 -I{} aws sqs send-message --queue-url "https://sqs.ap-northeast-1.amazonaws.com/123456789012/LambdaTestQueue" --message-body {}
しばらく待って、Lambda関数の同時実行数を確認してみると、次のグラフになっていました。
最大で13並列
に実行されていたようです。
次にMaxinum concurrency
に4
を指定してみます。
これでどう変わるでしょうか。先ほどと同じコマンドを実行しキューにメッセージ追加します。やってみた結果がこちら。
きっちり同時実行数が4
に抑えられています。
まとめ
これまでSQSをイベントソースとする際の同時実行数は、Lambda関数の「同時実行の予約」で行っていました。今回のアップデートで、Lambda関数自体の同時実行数ではなく、イベントソースマッピングの設定で指定できるようになりました。
これまで SQSをイベントソースとしたときの関数の並列度 を制限する目的で「同時実行の予約」を指定していた場合は「最大同時実行数」に置き換えるとよいでしょう。一方で 関数の同時インスタンス数 を制限する目的では引き続き「同時実行の予約」を使用してください。
また両方を同時に指定する場合、 同時実行の予約 > 最大同時実行数 となるように指定しないとスロットリングしてしまいますので注意してください。